From 290c34b2324a23e01b0957d7a1e0083c9b0f767b Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 12 Jan 2011 22:30:08 -0500 Subject: [PATCH] Try harder to find a good display name for paper sizes This was requested in https://bugzilla.gnome.org/show_bug.cgi?id=639186. Also add some tests for GtkPaperSize. --- gtk/gtkpapersize.c | 307 ++++++++++++++++++++++-------------------- gtk/tests/Makefile.am | 7 +- gtk/tests/papersize.c | 128 ++++++++++++++++++ 3 files changed, 291 insertions(+), 151 deletions(-) create mode 100644 gtk/tests/papersize.c diff --git a/gtk/gtkpapersize.c b/gtk/gtkpapersize.c index 7601aba552..8fbcddb373 100644 --- a/gtk/gtkpapersize.c +++ b/gtk/gtkpapersize.c @@ -63,7 +63,7 @@ struct _GtkPaperSize gchar *name; gchar *display_name; gchar *ppd_name; - + gdouble width, height; /* Stored in mm */ gboolean is_custom; }; @@ -80,7 +80,7 @@ lookup_paper_info (const gchar *name) int mid; int cmp; - do + do { mid = (lower + upper) / 2; cmp = strcmp (name, paper_names + standard_names_offsets[mid].name); @@ -89,7 +89,7 @@ lookup_paper_info (const gchar *name) else if (cmp > 0) lower = mid + 1; else - return &standard_names_offsets[mid]; + return &standard_names_offsets[mid]; } while (lower <= upper); @@ -98,15 +98,15 @@ lookup_paper_info (const gchar *name) static gboolean parse_media_size (const gchar *size, - gdouble *width_mm, - gdouble *height_mm) + gdouble *width_mm, + gdouble *height_mm) { const char *p; char *e; double short_dim, long_dim; p = size; - + short_dim = g_ascii_strtod (p, &e); if (p == e || *e != 'x') @@ -133,19 +133,19 @@ parse_media_size (const gchar *size, *width_mm = short_dim; if (height_mm) *height_mm = long_dim; - - return TRUE; + + return TRUE; } static gboolean parse_full_media_size_name (const gchar *full_name, - gchar **name, - gdouble *width_mm, - gdouble *height_mm) + gchar **name, + gdouble *width_mm, + gdouble *height_mm) { const char *p; const char *end_of_name; - + /* From the spec: media-size-self-describing-name = ( class-in "_" size-name "_" short-dim "x" long-dim "in" ) | @@ -170,7 +170,7 @@ parse_full_media_size_name (const gchar *full_name, return FALSE; p++; /* Skip _ */ - + p = strchr (p, '_'); if (p == NULL) return FALSE; @@ -184,20 +184,20 @@ parse_full_media_size_name (const gchar *full_name, if (name) *name = g_strndup (full_name, end_of_name - full_name); - - return TRUE; + + return TRUE; } static GtkPaperSize * gtk_paper_size_new_from_info (const PaperInfo *info) { GtkPaperSize *size; - + size = g_slice_new0 (GtkPaperSize); size->info = info; size->width = info->width; size->height = info->height; - + return size; } @@ -211,7 +211,7 @@ gtk_paper_size_new_from_info (const PaperInfo *info) * * If @name is %NULL, the default paper size is returned, * see gtk_paper_size_get_default(). - * + * * Return value: a new #GtkPaperSize, use gtk_paper_size_free() * to free it * @@ -227,35 +227,44 @@ gtk_paper_size_new (const gchar *name) if (name == NULL) name = gtk_paper_size_get_default (); - + if (parse_full_media_size_name (name, &short_name, &width, &height)) { - size = g_slice_new0 (GtkPaperSize); - - size->width = width; - size->height = height; - size->name = short_name; - size->display_name = g_strdup (short_name); - if (strncmp (short_name, "custom", 6) == 0) - size->is_custom = TRUE; + info = lookup_paper_info (short_name); + if (info != NULL && info->width == width && info->height == height) + { + size = gtk_paper_size_new_from_info (info); + g_free (short_name); + } + else + { + size = g_slice_new0 (GtkPaperSize); + + size->width = width; + size->height = height; + size->name = short_name; + size->display_name = g_strdup (short_name); + if (strncmp (short_name, "custom", 6) == 0) + size->is_custom = TRUE; + } } else { info = lookup_paper_info (name); if (info != NULL) - size = gtk_paper_size_new_from_info (info); + size = gtk_paper_size_new_from_info (info); else - { - g_warning ("Unknown paper size %s\n", name); - size = g_slice_new0 (GtkPaperSize); - size->name = g_strdup (name); - size->display_name = g_strdup (name); - /* Default to A4 size */ - size->width = 210; - size->height = 297; - } + { + g_warning ("Unknown paper size %s\n", name); + size = g_slice_new0 (GtkPaperSize); + size->name = g_strdup (name); + size->display_name = g_strdup (name); + /* Default to A4 size */ + size->width = 210; + size->height = 297; + } } - + return size; } @@ -265,12 +274,12 @@ gtk_paper_size_new (const gchar *name) * @ppd_display_name: the corresponding human-readable name * @width: the paper width, in points * @height: the paper height in points - * - * Creates a new #GtkPaperSize object by using - * PPD information. - * - * If @ppd_name is not a recognized PPD paper name, - * @ppd_display_name, @width and @height are used to + * + * Creates a new #GtkPaperSize object by using + * PPD information. + * + * If @ppd_name is not a recognized PPD paper name, + * @ppd_display_name, @width and @height are used to * construct a custom #GtkPaperSize object. * * Return value: a new #GtkPaperSize, use gtk_paper_size_free() @@ -280,9 +289,9 @@ gtk_paper_size_new (const gchar *name) */ GtkPaperSize * gtk_paper_size_new_from_ppd (const gchar *ppd_name, - const gchar *ppd_display_name, - gdouble width, - gdouble height) + const gchar *ppd_display_name, + gdouble width, + gdouble height) { char *name; const char *lookup_ppd_name; @@ -291,32 +300,32 @@ gtk_paper_size_new_from_ppd (const gchar *ppd_name, int i; lookup_ppd_name = ppd_name; - + freeme = NULL; /* Strip out Traverse suffix in matching. */ if (g_str_has_suffix (ppd_name, ".Transverse")) { lookup_ppd_name = freeme = - g_strndup (ppd_name, strlen (ppd_name) - strlen (".Transverse")); + g_strndup (ppd_name, strlen (ppd_name) - strlen (".Transverse")); } - + for (i = 0; i < G_N_ELEMENTS(standard_names_offsets); i++) { if (standard_names_offsets[i].ppd_name != -1 && - strcmp (paper_names + standard_names_offsets[i].ppd_name, lookup_ppd_name) == 0) - { - size = gtk_paper_size_new_from_info (&standard_names_offsets[i]); - goto out; - } + strcmp (paper_names + standard_names_offsets[i].ppd_name, lookup_ppd_name) == 0) + { + size = gtk_paper_size_new_from_info (&standard_names_offsets[i]); + goto out; + } } - + for (i = 0; i < G_N_ELEMENTS(extra_ppd_names_offsets); i++) { if (strcmp (paper_names + extra_ppd_names_offsets[i].ppd_name, lookup_ppd_name) == 0) - { - size = gtk_paper_size_new (paper_names + extra_ppd_names_offsets[i].standard_name); - goto out; - } + { + size = gtk_paper_size_new (paper_names + extra_ppd_names_offsets[i].standard_name); + goto out; + } } name = g_strconcat ("ppd_", ppd_name, NULL); @@ -329,57 +338,57 @@ gtk_paper_size_new_from_ppd (const gchar *ppd_name, size->info->ppd_name == -1 || strcmp (paper_names + size->info->ppd_name, ppd_name) != 0) size->ppd_name = g_strdup (ppd_name); - + g_free (freeme); - + return size; } /** * gtk_paper_size_new_custom: - * @name: the paper name + * @name: the paper name * @display_name: the human-readable name * @width: the paper width, in units of @unit * @height: the paper height, in units of @unit * @unit: the unit for @width and @height - * + * * Creates a new #GtkPaperSize object with the * given parameters. - * + * * Return value: a new #GtkPaperSize object, use gtk_paper_size_free() * to free it * * Since: 2.10 */ GtkPaperSize * -gtk_paper_size_new_custom (const gchar *name, - const gchar *display_name, - gdouble width, - gdouble height, - GtkUnit unit) +gtk_paper_size_new_custom (const gchar *name, + const gchar *display_name, + gdouble width, + gdouble height, + GtkUnit unit) { GtkPaperSize *size; g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (unit != GTK_UNIT_PIXEL, NULL); size = g_slice_new0 (GtkPaperSize); - + size->name = g_strdup (name); size->display_name = g_strdup (display_name); size->is_custom = TRUE; - + size->width = _gtk_print_convert_to_mm (width, unit); size->height = _gtk_print_convert_to_mm (height, unit); - + return size; } /** * gtk_paper_size_copy: * @other: a #GtkPaperSize - * + * * Copies an existing #GtkPaperSize. - * + * * Return value: a copy of @other * * Since: 2.10 @@ -398,7 +407,7 @@ gtk_paper_size_copy (GtkPaperSize *other) size->display_name = g_strdup (other->display_name); if (other->ppd_name) size->ppd_name = g_strdup (other->ppd_name); - + size->width = other->width; size->height = other->height; size->is_custom = other->is_custom; @@ -409,7 +418,7 @@ gtk_paper_size_copy (GtkPaperSize *other) /** * gtk_paper_size_free: * @size: a #GtkPaperSize - * + * * Free the given #GtkPaperSize object. * * Since: 2.10 @@ -428,23 +437,23 @@ gtk_paper_size_free (GtkPaperSize *size) * gtk_paper_size_is_equal: * @size1: a #GtkPaperSize object * @size2: another #GtkPaperSize object - * + * * Compares two #GtkPaperSize objects. - * - * Return value: %TRUE, if @size1 and @size2 + * + * Return value: %TRUE, if @size1 and @size2 * represent the same paper size * * Since: 2.10 */ gboolean gtk_paper_size_is_equal (GtkPaperSize *size1, - GtkPaperSize *size2) + GtkPaperSize *size2) { if (size1->info != NULL && size2->info != NULL) return size1->info == size2->info; - + return strcmp (gtk_paper_size_get_name (size1), - gtk_paper_size_get_name (size2)) == 0; + gtk_paper_size_get_name (size2)) == 0; } GList * _gtk_load_custom_papers (void); @@ -466,7 +475,7 @@ gtk_paper_size_get_paper_sizes (gboolean include_custom) { GList *list = NULL; guint i; -#ifdef G_OS_UNIX /* _gtk_load_custom_papers() only on Unix so far */ +#ifdef G_OS_UNIX /* _gtk_load_custom_papers() only on Unix so far */ if (include_custom) { GList *page_setups, *l; @@ -500,9 +509,9 @@ gtk_paper_size_get_paper_sizes (gboolean include_custom) /** * gtk_paper_size_get_name: * @size: a #GtkPaperSize object - * + * * Gets the name of the #GtkPaperSize. - * + * * Return value: the name of @size * * Since: 2.10 @@ -519,9 +528,9 @@ gtk_paper_size_get_name (GtkPaperSize *size) /** * gtk_paper_size_get_display_name: * @size: a #GtkPaperSize object - * + * * Gets the human-readable name of the #GtkPaperSize. - * + * * Return value: the human-readable name of @size * * Since: 2.10 @@ -543,10 +552,10 @@ gtk_paper_size_get_display_name (GtkPaperSize *size) /** * gtk_paper_size_get_ppd_name: * @size: a #GtkPaperSize object - * + * * Gets the PPD name of the #GtkPaperSize, which * may be %NULL. - * + * * Return value: the PPD name of @size * * Since: 2.10 @@ -565,17 +574,17 @@ gtk_paper_size_get_ppd_name (GtkPaperSize *size) * gtk_paper_size_get_width: * @size: a #GtkPaperSize object * @unit: the unit for the return value - * - * Gets the paper width of the #GtkPaperSize, in + * + * Gets the paper width of the #GtkPaperSize, in * units of @unit. - * - * Return value: the paper width + * + * Return value: the paper width * * Since: 2.10 */ gdouble -gtk_paper_size_get_width (GtkPaperSize *size, - GtkUnit unit) +gtk_paper_size_get_width (GtkPaperSize *size, + GtkUnit unit) { return _gtk_print_convert_from_mm (size->width, unit); } @@ -584,17 +593,17 @@ gtk_paper_size_get_width (GtkPaperSize *size, * gtk_paper_size_get_height: * @size: a #GtkPaperSize object * @unit: the unit for the return value - * - * Gets the paper height of the #GtkPaperSize, in + * + * Gets the paper height of the #GtkPaperSize, in * units of @unit. - * - * Return value: the paper height + * + * Return value: the paper height * * Since: 2.10 */ gdouble -gtk_paper_size_get_height (GtkPaperSize *size, - GtkUnit unit) +gtk_paper_size_get_height (GtkPaperSize *size, + GtkUnit unit) { return _gtk_print_convert_from_mm (size->height, unit); } @@ -602,9 +611,9 @@ gtk_paper_size_get_height (GtkPaperSize *size, /** * gtk_paper_size_is_custom: * @size: a #GtkPaperSize object - * + * * Returns %TRUE if @size is not a standard paper size. - * + * * Return value: whether @size is a custom paper size. **/ gboolean @@ -619,16 +628,16 @@ gtk_paper_size_is_custom (GtkPaperSize *size) * @width: the new width in units of @unit * @height: the new height in units of @unit * @unit: the unit for @width and @height - * + * * Changes the dimensions of a @size to @width x @height. * * Since: 2.10 */ void -gtk_paper_size_set_size (GtkPaperSize *size, - gdouble width, - gdouble height, - GtkUnit unit) +gtk_paper_size_set_size (GtkPaperSize *size, + gdouble width, + gdouble height, + GtkUnit unit) { g_return_if_fail (size != NULL); g_return_if_fail (size->is_custom); @@ -643,12 +652,12 @@ gtk_paper_size_set_size (GtkPaperSize *size, /** * gtk_paper_size_get_default: * - * Returns the name of the default paper size, which - * depends on the current locale. - * + * Returns the name of the default paper size, which + * depends on the current locale. + * * Return value: the name of the default paper size. The string * is owned by GTK+ and should not be modified. - * + * * Since: 2.10 */ G_CONST_RETURN gchar * @@ -661,10 +670,10 @@ gtk_paper_size_get_default (void) { int width = NL_PAPER_GET (_NL_PAPER_WIDTH); int height = NL_PAPER_GET (_NL_PAPER_HEIGHT); - + if (width == 210 && height == 297) return GTK_PAPER_NAME_A4; - + if (width == 216 && height == 279) return GTK_PAPER_NAME_LETTER; } @@ -701,7 +710,7 @@ gtk_paper_size_get_default (void) * I've taken the actual values used from the OSX page setup dialog. * I'm not sure exactly where they got these values for, but might * correspond to this (from ghostscript docs): - * + * * All DeskJets have 0.5 inches (1.27cm) of unprintable bottom margin, * due to the mechanical arrangement used to grab the paper. Side margins * are approximately 0.25 inches (0.64cm) for U.S. letter paper, and 0.15 @@ -712,16 +721,16 @@ gtk_paper_size_get_default (void) * gtk_paper_size_get_default_top_margin: * @size: a #GtkPaperSize object * @unit: the unit for the return value - * + * * Gets the default top margin for the #GtkPaperSize. - * + * * Return value: the default top margin * * Since: 2.10 */ gdouble -gtk_paper_size_get_default_top_margin (GtkPaperSize *size, - GtkUnit unit) +gtk_paper_size_get_default_top_margin (GtkPaperSize *size, + GtkUnit unit) { gdouble margin; @@ -733,16 +742,16 @@ gtk_paper_size_get_default_top_margin (GtkPaperSize *size, * gtk_paper_size_get_default_bottom_margin: * @size: a #GtkPaperSize object * @unit: the unit for the return value - * + * * Gets the default bottom margin for the #GtkPaperSize. - * + * * Return value: the default bottom margin * * Since: 2.10 */ gdouble -gtk_paper_size_get_default_bottom_margin (GtkPaperSize *size, - GtkUnit unit) +gtk_paper_size_get_default_bottom_margin (GtkPaperSize *size, + GtkUnit unit) { gdouble margin; const gchar *name; @@ -754,7 +763,7 @@ gtk_paper_size_get_default_bottom_margin (GtkPaperSize *size, strcmp (name, "na_legal") == 0 || strcmp (name, "iso_a4") == 0) margin = _gtk_print_convert_to_mm (0.56, GTK_UNIT_INCH); - + return _gtk_print_convert_from_mm (margin, unit); } @@ -762,16 +771,16 @@ gtk_paper_size_get_default_bottom_margin (GtkPaperSize *size, * gtk_paper_size_get_default_left_margin: * @size: a #GtkPaperSize object * @unit: the unit for the return value - * + * * Gets the default left margin for the #GtkPaperSize. - * + * * Return value: the default left margin * * Since: 2.10 */ gdouble -gtk_paper_size_get_default_left_margin (GtkPaperSize *size, - GtkUnit unit) +gtk_paper_size_get_default_left_margin (GtkPaperSize *size, + GtkUnit unit) { gdouble margin; @@ -783,16 +792,16 @@ gtk_paper_size_get_default_left_margin (GtkPaperSize *size, * gtk_paper_size_get_default_right_margin: * @size: a #GtkPaperSize object * @unit: the unit for the return value - * + * * Gets the default right margin for the #GtkPaperSize. - * + * * Return value: the default right margin * * Since: 2.10 */ gdouble -gtk_paper_size_get_default_right_margin (GtkPaperSize *size, - GtkUnit unit) +gtk_paper_size_get_default_right_margin (GtkPaperSize *size, + GtkUnit unit) { gdouble margin; @@ -808,7 +817,7 @@ gtk_paper_size_get_default_right_margin (GtkPaperSize *size, * @error: (allow-none): return location for an error, or %NULL * * Reads a paper size from the group @group_name in the key file - * @key_file. + * @key_file. * * Returns: a new #GtkPaperSize object with the restored * paper size, or %NULL if an error occurred. @@ -817,8 +826,8 @@ gtk_paper_size_get_default_right_margin (GtkPaperSize *size, */ GtkPaperSize * gtk_paper_size_new_from_key_file (GKeyFile *key_file, - const gchar *group_name, - GError **error) + const gchar *group_name, + GError **error) { GtkPaperSize *paper_size = NULL; char *name = NULL, *ppd_name = NULL, *display_name = NULL, *freeme = NULL; @@ -855,11 +864,11 @@ gtk_paper_size_new_from_key_file (GKeyFile *key_file, #undef GET_DOUBLE name = g_key_file_get_string (key_file, group_name, - "Name", NULL); + "Name", NULL); ppd_name = g_key_file_get_string (key_file, group_name, - "PPDName", NULL); + "PPDName", NULL); display_name = g_key_file_get_string (key_file, group_name, - "DisplayName", NULL); + "DisplayName", NULL); /* Fallback for old ~/.gtk-custom-paper entries */ if (!display_name) display_name = g_strdup (name); @@ -871,7 +880,7 @@ gtk_paper_size_new_from_key_file (GKeyFile *key_file, _gtk_print_convert_from_mm (height, GTK_UNIT_POINTS)); else if (name != NULL) paper_size = gtk_paper_size_new_custom (name, display_name, - width, height, GTK_UNIT_MM); + width, height, GTK_UNIT_MM); else { g_set_error_literal (error, @@ -904,8 +913,8 @@ out: */ void gtk_paper_size_to_key_file (GtkPaperSize *size, - GKeyFile *key_file, - const gchar *group_name) + GKeyFile *key_file, + const gchar *group_name) { const char *name, *ppd_name, *display_name; @@ -916,19 +925,19 @@ gtk_paper_size_to_key_file (GtkPaperSize *size, display_name = gtk_paper_size_get_display_name (size); ppd_name = gtk_paper_size_get_ppd_name (size); - if (ppd_name != NULL) + if (ppd_name != NULL) g_key_file_set_string (key_file, group_name, - "PPDName", ppd_name); + "PPDName", ppd_name); else g_key_file_set_string (key_file, group_name, - "Name", name); + "Name", name); - if (display_name) + if (display_name) g_key_file_set_string (key_file, group_name, - "DisplayName", display_name); + "DisplayName", display_name); g_key_file_set_double (key_file, group_name, - "Width", gtk_paper_size_get_width (size, GTK_UNIT_MM)); + "Width", gtk_paper_size_get_width (size, GTK_UNIT_MM)); g_key_file_set_double (key_file, group_name, - "Height", gtk_paper_size_get_height (size, GTK_UNIT_MM)); + "Height", gtk_paper_size_get_height (size, GTK_UNIT_MM)); } diff --git a/gtk/tests/Makefile.am b/gtk/tests/Makefile.am index 008823cf94..f27796fe82 100644 --- a/gtk/tests/Makefile.am +++ b/gtk/tests/Makefile.am @@ -90,7 +90,7 @@ filtermodel_LDADD = $(progs_ldadd) TEST_PROGS += expander expander_SOURCES = expander.c -expander_LDADD = $(progs_ldadd) +expander_LDADD = $(progs_ldadd) TEST_PROGS += action action_SOURCES = action.c @@ -99,8 +99,11 @@ action_LDADD = $(progs_ldadd) TEST_PROGS += stylecontext stylecontext_SOURCES = stylecontext.c stylecontext_LDADD = $(progs_ldadd) -EXTRA_DIST += test.css test.png +EXTRA_DIST += test.css test.png +TEST_PROGS += papersize +papersize_SOURCES = papersize.c +papersize_LDADD = $(progs_ldadd) EXTRA_DIST += \ file-chooser-test-dir/empty \ diff --git a/gtk/tests/papersize.c b/gtk/tests/papersize.c new file mode 100644 index 0000000000..62e7a90e87 --- /dev/null +++ b/gtk/tests/papersize.c @@ -0,0 +1,128 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 2011 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +static void +test_parse (void) +{ + GtkPaperSize *p; + + p = gtk_paper_size_new (GTK_PAPER_NAME_A4); + g_assert (p != NULL); + g_assert_cmpint (gtk_paper_size_get_width (p, GTK_UNIT_MM), ==, 210); + g_assert_cmpint (gtk_paper_size_get_height (p, GTK_UNIT_MM), ==, 297); + g_assert_cmpstr (gtk_paper_size_get_name (p), ==, "iso_a4"); + g_assert_cmpstr (gtk_paper_size_get_display_name (p), ==, "A4"); + g_assert_cmpstr (gtk_paper_size_get_ppd_name (p), ==, "A4"); + g_assert (!gtk_paper_size_is_custom (p)); + gtk_paper_size_free (p); + + p = gtk_paper_size_new (GTK_PAPER_NAME_B5); + g_assert (p != NULL); + g_assert_cmpint (gtk_paper_size_get_width (p, GTK_UNIT_MM), ==, 176); + g_assert_cmpint (gtk_paper_size_get_height (p, GTK_UNIT_MM), ==, 250); + g_assert_cmpstr (gtk_paper_size_get_name (p), ==, "iso_b5"); + g_assert_cmpstr (gtk_paper_size_get_display_name (p), ==, "B5"); + g_assert_cmpstr (gtk_paper_size_get_ppd_name (p), ==, "ISOB5"); + g_assert (!gtk_paper_size_is_custom (p)); + gtk_paper_size_free (p); + + p = gtk_paper_size_new (GTK_PAPER_NAME_EXECUTIVE); + g_assert (p != NULL); + g_assert_cmpint (gtk_paper_size_get_width (p, GTK_UNIT_MM), ==, 184); + g_assert_cmpint (gtk_paper_size_get_height (p, GTK_UNIT_MM), ==, 266); + g_assert_cmpstr (gtk_paper_size_get_name (p), ==, "na_executive"); + g_assert_cmpstr (gtk_paper_size_get_display_name (p), ==, "Executive"); + g_assert_cmpstr (gtk_paper_size_get_ppd_name (p), ==, "Executive"); + g_assert (!gtk_paper_size_is_custom (p)); + gtk_paper_size_free (p); + + p = gtk_paper_size_new ("iso_a4_210x297mm"); + g_assert (p != NULL); + g_assert_cmpint (gtk_paper_size_get_width (p, GTK_UNIT_MM), ==, 210); + g_assert_cmpint (gtk_paper_size_get_height (p, GTK_UNIT_MM), ==, 297); + g_assert_cmpstr (gtk_paper_size_get_name (p), ==, "iso_a4"); + g_assert_cmpstr (gtk_paper_size_get_display_name (p), ==, "A4"); + g_assert_cmpstr (gtk_paper_size_get_ppd_name (p), ==, "A4"); + g_assert (!gtk_paper_size_is_custom (p)); + gtk_paper_size_free (p); + + p = gtk_paper_size_new ("custom_w1_20x30in"); + g_assert (p != NULL); + g_assert_cmpint (gtk_paper_size_get_width (p, GTK_UNIT_INCH), ==, 20); + g_assert_cmpint (gtk_paper_size_get_height (p, GTK_UNIT_INCH), ==, 30); + g_assert_cmpstr (gtk_paper_size_get_name (p), ==, "custom_w1"); + g_assert_cmpstr (gtk_paper_size_get_display_name (p), ==, "custom_w1"); + g_assert (gtk_paper_size_is_custom (p)); + gtk_paper_size_free (p); +} + +static void +test_compare (void) +{ + GtkPaperSize *a1, *a2, *b, *c; + + a1 = gtk_paper_size_new (GTK_PAPER_NAME_A4); + a2 = gtk_paper_size_new ("iso_a4_210x297mm"); + b = gtk_paper_size_new (GTK_PAPER_NAME_B5); + c = gtk_paper_size_new ("custom_w1_20x30in"); + + g_assert (gtk_paper_size_is_equal (a1, a2)); + g_assert (!gtk_paper_size_is_equal (a1, b)); + g_assert (!gtk_paper_size_is_equal (a1, c)); + g_assert (!gtk_paper_size_is_equal (b, c)); + + gtk_paper_size_free (a1); + gtk_paper_size_free (a2); + gtk_paper_size_free (b); + gtk_paper_size_free (c); +} + +static void +test_units (void) +{ + GtkPaperSize *p; + + p = gtk_paper_size_new (GTK_PAPER_NAME_A4); + + g_assert_cmpint (gtk_paper_size_get_width (p, GTK_UNIT_MM), ==, 210); + g_assert_cmpint (gtk_paper_size_get_height (p, GTK_UNIT_MM), ==, 297); + + /* compare up to 2 decimals */ + g_assert_cmpint (100 * gtk_paper_size_get_width (p, GTK_UNIT_INCH), ==, 100 * 8.26); + g_assert_cmpint (100 * gtk_paper_size_get_height (p, GTK_UNIT_INCH), ==, 100 * 11.69); + + g_assert_cmpint (gtk_paper_size_get_width (p, GTK_UNIT_POINTS), ==, 595); + g_assert_cmpint (gtk_paper_size_get_height (p, GTK_UNIT_POINTS), ==, 841); + + gtk_paper_size_free (p); +} + +int +main (int argc, char *argv[]) +{ + gtk_test_init (&argc, &argv); + + g_test_add_func ("/paper-size/parse", test_parse); + g_test_add_func ("/paper-size/compare", test_compare); + g_test_add_func ("/paper-size/units", test_units); + + return g_test_run(); +} -- 2.30.2